package ar.edu.utn.frgp.labtec.actions.contrato;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;

import ar.edu.utn.frgp.labtec.constants.DBParametersConstants;
import ar.edu.utn.frgp.labtec.constants.ServiceNameConstants;
import ar.edu.utn.frgp.labtec.constants.WebConstants;
import ar.edu.utn.frgp.labtec.entities.BooleanEnum;
import ar.edu.utn.frgp.labtec.entities.Cliente;
import ar.edu.utn.frgp.labtec.entities.EstadoEnum;
import ar.edu.utn.frgp.labtec.entities.Laboratorio;
import ar.edu.utn.frgp.labtec.entities.OrdenDeTrabajo;
import ar.edu.utn.frgp.labtec.entities.RevisionContrato;
import ar.edu.utn.frgp.labtec.entities.Usuario;
import ar.edu.utn.frgp.labtec.service.GestionContratoService;
import ar.edu.utn.frgp.labtec.service.GestionLaboratorioService;
import ar.edu.utn.frgp.labtec.service.GestionOrdenTrabajoService;
import ar.edu.utn.frgp.labtec.service.GestionUsuarioService;

@SuppressWarnings("serial")
public class GuardarContratoAction extends ContratoAction  {
	
	public String execute(){
		RevisionContrato contrato;

		setUsuariosContrato();
		contrato = crearObjContrato();
		if(idContrato == null){
			crearContrato(contrato);
		}else{
			guardarContrato(contrato);
		}
		ServletActionContext.getRequest().setAttribute(DBParametersConstants.ID_CONTRATO, contrato.getIdContrato());
		ServletActionContext.getRequest().setAttribute(DBParametersConstants.ANIO_CONTRATO, contrato.getAnioContrato());
		
		return SUCCESS;
	}
	
	private RevisionContrato crearObjContrato(){
		
		RevisionContrato contrato = new RevisionContrato();
		
		contrato.setIdContrato(idContrato);
		contrato.setAnioContrato(anioContrato);
		contrato.setIdOrden(idOrden);
		contrato.setOrdenDeTrabajo(getOrdenTrabajo());
		contrato.setEstado(EstadoEnum.H);
		
		/** Solicitud cliente */
		Cliente cliente = new Cliente();
		cliente.setCodCliente(codCliente);
		contrato.setCliente(cliente);
		
		contrato.setRequisitos(requisitos);
		contrato.setLaboratorio(getLaboratorioObj());
		if(contrato.getLaboratorio() != null)
			contrato.setDepartamento(contrato.getLaboratorio().getDepartamento());
		contrato.setUsuRequisitos(getUsuario(usuRequisitos));
		contrato.setFechaRequisitos(getDate(fechaRequisitos));
		
		/** Factibilidad */
		contrato.setRecursosDisp(getBooleanEnum(recursosDisp));
		contrato.setDetalleRecDisp(detalleRecDisp);
		contrato.setUsuDisponibilidad(getUsuario(usuDisponibilidad));
		contrato.setFechaDisponibilidad(getDate(fechaDisponibilidad));
		
		/** Subcontratacion */
		contrato.setSubcontratar(getBooleanEnum(subcontratar));
		contrato.setDetalleSubc(detalleSubc);
		
		/** Tarea a realizar*/
		contrato.setFechaRealizacion(getDate(fechaRealizacion));
		contrato.setTrabajoArealizar(trabajoArealizar);
		
		/** Revision */
		contrato.setAcuerdoTrabajo(getBooleanEnum(acuerdoTrabajo));
		contrato.setCausasRechModif(causasRechModif);
		contrato.setUsuAcuerdoTrabajo(getUsuario(usuAcuerdoTrabajo));
		contrato.setFechaAcuerdoTrabajo(getDate(fechaAcuerdoTrabajo));
		
		/** Entrega */
		contrato.setDatosElemMedir(datosElemMedir);
		contrato.setEstadoConserv(getBooleanEnum(estadoConserv));
		contrato.setFechaEntregaInf(getDate(fechaEntregaInf));
		contrato.setRecibioElem(getBooleanEnum(recibioElem));
		contrato.setFechaRecibioElem(getDate(fechaRecibioElem));
		contrato.setUsuEntrega(getUsuario(usuEntrega));
		contrato.setFechaEntrega(getDate(fechaEntrega));
		
		return contrato;
	}
	
	private Laboratorio getLaboratorioObj(){
		if(laboratorio != null){
			GestionLaboratorioService laboratorioService = (GestionLaboratorioService) getContext().
				getBean(ServiceNameConstants.GESTION_LABORATORIO_SERVICE);
			
			Laboratorio laboratorioObj = laboratorioService.getLaboratorio(laboratorio, departamento);
			return laboratorioObj;
		}else
			return null;
	}
	
	private OrdenDeTrabajo getOrdenTrabajo(){
		if(idOrden != null){
			GestionOrdenTrabajoService ordenTrabajoService = (GestionOrdenTrabajoService) getContext().
				getBean(ServiceNameConstants.GESTION_ORDEN_TRABAJO_SERVICE);
			
			OrdenDeTrabajo ordenTrabajo = ordenTrabajoService.getOrdenDeTrabajo(idOrden);
			
			return ordenTrabajo;
		}else
			return null;
	}
	
	private Usuario getUsuario(String nombre){
		if(nombre != null){
			GestionUsuarioService usuarioService = (GestionUsuarioService)getContext().
				getBean(ServiceNameConstants.GESTION_USUARIO_SERVICE);
			
			Usuario usuario = usuarioService.getUsuario(nombre);
			return usuario;
		}else
			return null;
	}
	
	private Date getDate(String fecha){
		
		if (fecha != null) {
			SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yy");
			try {
				return dateFormat.parse(fecha);
			} catch (ParseException e) {
				return null;
			}
		}else
			return null;
		
	}
	
	private BooleanEnum getBooleanEnum(Integer value){
		if(value != null)
			if(value == 0)
				return BooleanEnum.NO;
			else
				return BooleanEnum.SI;
		else
			return null;
	}
	
	private void setUsuariosContrato(){
		Usuario usuario = (Usuario) ActionContext.getContext().getSession().get("usuario");
		if(WebConstants.ZONA_SOLICITUD.equals(zonaContrato)){
			usuRequisitos = usuario.getNombre();
			fechaRequisitos = formatDate(new Date());
		}
		else if(WebConstants.ZONA_FACTIBILIDAD.equals(zonaContrato)){
			usuDisponibilidad = usuario.getNombre();
			fechaDisponibilidad = formatDate(new Date());
		}
		else if(WebConstants.ZONA_REVISION.equals(zonaContrato)){
			usuAcuerdoTrabajo = usuario.getNombre();
		}
		else if(WebConstants.ZONA_ENTREGA.equals(zonaContrato)){
			usuEntrega = usuario.getNombre();
		}
	}

	private void crearContrato(RevisionContrato contrato){
		
		GestionContratoService contratoService = (GestionContratoService) getContext().
			getBean(ServiceNameConstants.GESTION_CONTRATO_SERVICE);
		
		contratoService.createContrato(contrato);
	}
	
	private void guardarContrato(RevisionContrato contrato){
		
		GestionContratoService contratoService = (GestionContratoService) getContext().
			getBean(ServiceNameConstants.GESTION_CONTRATO_SERVICE);
		
		OrdenDeTrabajo orden = null;
		
		if(WebConstants.ZONA_REVISION.equals(zonaContrato)){
			orden = crearOrdenDeTrabajo();
			if(orden != null && orden.getIdOrden() != null){
				contrato.setIdOrden(orden.getIdOrden());
			}
				
		}
		
		contratoService.updateContrato(contrato);
		
	}
	
	private OrdenDeTrabajo crearOrdenDeTrabajo(){
		GestionOrdenTrabajoService ordenService = (GestionOrdenTrabajoService)getContext().getBean(ServiceNameConstants.GESTION_ORDEN_TRABAJO_SERVICE);
		OrdenDeTrabajo orden = createObjOrden();
		
		if(getBooleanEnum(acuerdoTrabajo) != null){
			if(ordenService.exists(idOrden)){
				orden = ordenService.getOrdenDeTrabajo(idOrden);
				
				if(getBooleanEnum(acuerdoTrabajo).equals(BooleanEnum.SI)){
					orden.setEstado(EstadoEnum.H);
					ordenService.updateOrdenDeTrabajo(orden);
				}else{
					orden.setEstado(EstadoEnum.I);
					ordenService.updateOrdenDeTrabajo(orden);
				}
				
			}else{
				if(getBooleanEnum(acuerdoTrabajo).equals(BooleanEnum.SI)){
					ordenService.crearOrdenDeTrabajo(orden);
				}
			}
		}
		
		return orden;
	}
	
	
	private OrdenDeTrabajo createObjOrden(){
		OrdenDeTrabajo orden = new OrdenDeTrabajo();
		
		orden.setIdOrden(idOrden);
		orden.setAnioOrden(anioOrden);
		orden.setCodDepto(departamento);
		orden.setCodLab(laboratorio);
		
		Cliente cliente = new Cliente();
		cliente.setCodCliente(codCliente);
		orden.setCliente(cliente);
		
		return orden;
	}
}